package produce.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * mq消息类型转换器配置 将mq发送的消息转换为json
 */
@Configuration
public class MqConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;

//    @Bean
//    public MessageConverter messageConverter() {
//        return new Jackson2JsonMessageConverter();
//    }


    /**
     * @PostConstruct表示对象创建完成后调用此方法
     */
    @PostConstruct
    public void initRabbitTemplate(){
        //发送方确认回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * 只要消息抵达broker服务器 那么ack=true
             * @param correlationData 当前消息的唯一关联数据（这个是消息的唯一id）
             * @param b 消息是否成功收到
             * @param s 失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                //实现发送方确认，比如发送交换机失败，则将发送的消息入库
                //CorrelationData是业务id的封装类，可以在客户端发送消息时，携带这个信息(可以在发送时，增加这个参数，参加RabbitmqMessageSend)，当这里出现问题时，找到这笔消息
                // null
                System.out.println(correlationData);
                //这个布尔值就是消息是否发送到交换机成功标识，可以根据这个标识对错误信息，进行处理
                // 成功 true 失败 false
                System.out.println(b);
                //发送失败信息 成功为null
                //channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'direct_exchange' in vhost 'my_vhost', class-id=60, method-id=40)
                System.out.println(s);
            }
        });

        //消息未抵达队列的失败回调
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * 只要消息没有投递到指定的队列，就触发这个失败回调
             * @param message 投递失败的消息详细信息
             * @param replyCode 回复的状态码
             * @param replyText 回复的文本内容
             * @param exchange 当时这个消息发送给那个交换机
             * @param routingKey 当时这个消息用哪个路由键
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println(message);
                System.out.println(message.getMessageProperties().getMessageId());
                System.out.println(replyCode);
                System.out.println(replyText);
                System.out.println(exchange);
                System.out.println(routingKey);
            }
        });

    }
}
